package main

import (
	"fmt"
	"github.com/gorhill/cronexpr"
	"time"
)

func main() {

	var (
		expr     *cronexpr.Expression
		err      error
		nowTime  time.Time
		nextTime time.Time
	)
	// 错误例子：
	// 输出为 ：哪分钟 0-59
	//哪小时0-23，哪天1-31，哪月1-12，周几 0-6
	//if expr, err = cronexpr.Parse("* * * * *123"); err != nil {
	//	fmt.Println(err)
	//	return
	//}

	//每分钟执行一次
	//if expr, err = cronexpr.Parse("* * * * *"); err != nil {
	//	fmt.Println(err)
	//	return
	//}

	//每五分钟执行一次
	//if expr, err = cronexpr.Parse("*/5 * * * *"); err != nil {
	//	fmt.Println(err)
	//	return
	//}

	//每五秒执行一次
	if expr, err = cronexpr.Parse("*/5 * * * * * *"); err != nil {
		fmt.Println(err)
		return
	}
	//可以用下面这句话避免声明单无用的变量报错
	expr = expr
	//fmt.Println(expr)

	nowTime = time.Now()

	nextTime = expr.Next(nowTime)

	//2020-04-02 21:43:14.7361312 +0800 CST m=+0.004014601 2020-04-02 21:45:00 +0800 CS
	//注意cron是根据时间切开的，比如每分钟执行一次，是在每小时的0分，6分，12分，18分去执行，和启动脚本的绝对时间没有关系
	fmt.Println(nowTime)
	fmt.Println(nextTime)

	//用算出来的时间-当前的时间，等待这个定时器超时
	time.NewTimer(nextTime.Sub(nowTime))

	time.AfterFunc(nextTime.Sub(nowTime), func() {
		fmt.Println("called at: ", nextTime)
	})
	//避免主进程关闭
	time.Sleep(5 * time.Second)
	fmt.Println("main over")
}
